package org.phantom.securityframework.api.factory;
//package com.isoftstone.securityframework.api.factory;
//
//import java.lang.reflect.Field;
//import java.lang.reflect.Proxy;
//import java.util.Map;
//
//import org.springframework.aop.framework.AdvisedSupport;
//import org.springframework.aop.framework.AopProxy;
//import org.springframework.context.ApplicationContext;
///**
// * spring工厂抽象超类，通过子类提供的ApplicationContext获取指定的service
// * @author david
// *
// */
//public abstract class DefaultSpringManagerFactory implements ManagerFactory {
//
//	@SuppressWarnings({ "rawtypes" })
//	@Override
//	public Object getService(Class parentClass) {
//		try {
//			ApplicationContext ctx = this.getApplicationContext(subClass,parentClass);
//			return this.getSpringBean(ctx,subClass,parentClass);
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//		return null;
//	}
//	/**
//	 * 获取spring bean
//	 * @param ctx spring context
//	 * @param subClass 目标class
//	 * @param parentClass 目标的超类class
//	 * @return bean
//	 * @throws Exception
//	 */
//	@SuppressWarnings({ "rawtypes", "unchecked" })
//	protected Object getSpringBean(ApplicationContext ctx,Class subClass,Class parentClass) throws Exception{
//
//		Map beans = ctx.getBeansOfType(parentClass);
//		if(beans!=null && beans.size()>0){
//			for (Object o:beans.values()) {
//				if(o instanceof Proxy){
//					Field h = o.getClass().getSuperclass().getDeclaredField("h");  
//			        h.setAccessible(true);  
//			        AopProxy proxy = (AopProxy) h.get(o);  
//			          
//			        Field advised = proxy.getClass().getDeclaredField("advised");  
//			        advised.setAccessible(true);  
//			          
//			        Object target = ((AdvisedSupport)advised.get(proxy)).getTargetSource().getTarget();
//			        if(target.getClass().getName().equals(subClass.getName())){
//			        	return o;
//			        }
//				}else if(o.getClass().getName().equals(subClass.getName())){
//					return o;
//				}
//			}
//		}
//		return null;
//	}
//
//	/**
//	 * 由子类根据不同环境，提供对应的ApplicationContext
//	 * @param subClass
//	 * @param parentClass
//	 * @return
//	 */
//	@SuppressWarnings("rawtypes")
//	protected abstract ApplicationContext getApplicationContext(Class subClass,Class parentClass);
//
//}
